<?php

/**
 * 【PC版】共通 コントローラ
 */
abstract class Renew_BaseController extends Apm_Controller_Base
{
    /** metaタグ(title) */
    protected $_meta_title = null;
    /** metaタグ(description) */
    protected $_meta_description = null;
    /** metaタグ(keywords) */
    protected $_meta_keywords = null;
    /** alternateタグ用URL */
    protected $_alternate_url = null;

    /**
     * 初期処理
     */
    public function preDispatch()
    {
        $module_names = array(
            'Search',
            'Rstdtl',
            'Rstobi',
            'Shop'
        );

        // インスタンス生成
        foreach ($module_names as $module_name)
        {
            $params = array(
                'namespace' => $module_name,
                'basePath' => APPLICATION_PATH . '/modules/' . strtolower($module_name)
            );

            $loader = new Zend_Application_Module_Autoloader($params);
        }
    }

    /**
     * テンプレートパス取得（scriptsフォルダ内）
     *
     * @param $typ テンプレート名
     * @return テンプレートパス
     */
    public function getViewScriptPath($typ)
    {
        return $this->getViewPath('scripts', $typ);
    }

    /**
     * テンプレートパス取得（helpersフォルダ内）
     *
     * @param $typ テンプレート名
     * @return テンプレートパス
     */
    public function getViewHelperPath($typ)
    {
        return $this->getViewPath('helpers', $typ);
    }

    /**
     * 整形後のhtml取得（helpersフォルダ内）
     *
     * @param $typ テンプレート名
     * @return 整形後のhtml
     */
    public function getApmHelper($name)
    {
        $path = $this->getViewPath('helpers', $name);
        $helper = new Apm_Helper_Base();
        $helper->setTemplateFilePath($path);
        return $helper;
    }

    /**
     * テンプレート出力処理
     *
     * @param $typ テンプレート名
     * @param $topbar テンプレート名（画面上部）
     */
    protected function displayBody($typ, $topbar)
    {
        // テンプレートのパスを取得
        $contents = $this->getViewScriptPath($typ);
        $header = $this->getViewHelperPath('header_' . $typ);
        $footer = $this->getViewHelperPath('footer_' . $typ);

        // SEO対策用のmetaを設定
        $this->setSeoMeta();

        // 値が存在しない場合は固定文言
        if (empty($this->_meta_title))
        {
            $this->_meta_title = '賃貸マンション・アパートの賃貸情報 【アパマンショップ】';
        }
        if (empty($this->_meta_description))
        {
            $this->_meta_description = '賃貸・賃貸住宅の情報ならアパマンショップネットワーク。賃貸マンション・アパートなど、';
        }

        $this->_property['page_title'] = $this->_meta_title;
        $this->_property['page_description'] = $this->_meta_description;
        $this->_property['page_keywords'] = $this->_meta_keywords;
        $this->_property['page_url'] = $this->_alternate_url;

        // ユビキャストタグ表示フラグ
        $ubicast_flg = '0';

        switch ($this->getRequest()->getControllerName())
        {
            // コントローラ名・表示テンプレート名により判断
            case 'archentry':
            case 'bukkenentry':
            case 'bukkenentry2':
            case 'conditionsentry':
            case 'shopentry':
                if ($typ == 'entry' || $typ == 'error') $ubicast_flg = '1';
                break;
            case 'requestsearch':
                if ($typ == 'index') $ubicast_flg = '1';
                break;
            default:
                break;
        }
        $this->_property['ubicast_flg'] = $ubicast_flg;

        // 表示
        $this->display($contents, $header, $footer, $topbar);
    }

    /**
     * テンプレート出力処理（画面上部テンプレート固定）
     *
     * @param $typ テンプレート名
     */
    protected function displayBody2($typ)
    {
        $this->displayBody($typ, 'topbar2');
    }

    /**
     * テンプレートパス取得
     *
     * @param $folder フォルダ名
     * @param $typ テンプレート名
     * @return テンプレートパス
     */
    protected function getViewPath($folder, $typ)
    {
        $path = APPLICATION_PATH . '/modules/renew/views/';
        $path .= $this->getRequest()->getControllerName();
        return $path . '/' . $folder . '/' . $typ . '.tpl';
    }

    /**
     * 都道府県コード名から都道府県コードを取得
     *
     * @param $prefCodeName 都道府県コード名
     * @return 都道府県コード
     */
    protected function getPrefCode($prefCodeName)
    {
        return array_search($prefCodeName, Apm_Config_Search::$TODOUFUKEN_NAME_CODE_LIST);
    }

    /**
     * 都道府県コードから都道府県コード名を取得
     *
     * @param $prefCode 都道府県コード
     * @return 都道府県コード名
     */
    protected function getPrefName($prefCode)
    {
        return Apm_Config_Search::$TODOUFUKEN_NAME_CODE_LIST[$prefCode];
    }

    /**
     * 都道府県コードから都道府県名を取得
     *
     * @param $prefCode 都道府県コード
     * @return 都道府県名
     */
    protected function getPrefNameJP($prefCode)
    {
        return Apm_Config_Shop::$PREF_LIST[$prefCode];
    }

    /**
     * 都道府県名取得（北海道以外の最後の都府県を削除）
     *
     * @param $prefName 都道府県名
     * @return 都道府県名
     */
    protected function getPrefNameWithoutPostfix($prefName)
    {
        if (0 != strcmp($prefName, "北海道") && $prefName !== "北海道")
        {
            return mb_substr($prefName, 0, -1);
        }
        return $prefName;
    }

    /**
     * 問い合わせapi呼び出し
     *
     * @param $api api名称
     * @param $params リクエストパラメータ
     * @return CV用パラメータ
     */
    protected function callInquiryApi($api, $params)
    {
        $cli = new Zend_Http_Client($this->_config['apm']['ssl']['baseurl'] . 'inquiry/' . $api, array(
            'maxredirects' => 1,
            'timeout' => 60
        ));
        if (!array_key_exists('mode', $params))
        {
            $params['mode'] = 'json';
        }
        $cli->setParameterPost($params);

        $response = $cli->request(Zend_Http_Client::POST);
        $encode = mb_detect_encoding($response->getBody());
        if ($encode != 'UTF-8')
        {
            $body = Apm_Util::mbConvertEncodingArray($response->getBody(), 'UTF-8', $encode);
        }
        else
        {
            $body = $response->getBody();
        }
        $resArray = json_decode($body, true);
        $result = $resArray["api_result"]["result"];
        // CV用
        $this->_CV_data['CV_ToiawaseId'] = $resArray["CV_ToiawaseId"];
        $this->_CV_data['CV_bukken'] = $resArray["CV_bukken"];
        $this->_CV_data['CV_TotalAmounts'] = $resArray["CV_TotalAmounts"];

        return $result;
    }

    /**
     * リダイレクト(通常)
     *
     * @param $path リダイレクト先のパス（ドメイン除く）
     */
    protected function my_redirect($path)
    {
        $baseurl = $this->_config['apm']['baseurl'];
        Apm_Util::redirect($baseurl . $path);
    }

    /**
     * リダイレクト(SSL)
     *
     * @param $path リダイレクト先のパス（ドメイン除く）
     */
    protected function my_secure_redirect($path)
    {
        $baseurl = $this->_config['apm']['ssl']['baseurl'];
        Apm_Util::redirect($baseurl . $path);
    }

    /**
     * リクエストパラメータ内のキャンペーン情報のみを抜き出す
     *
     * @param $params リクエストパラメータ
     * @return キャンペーン情報
     */
    protected function collectCampaignFromParams($params)
    {
        $cams = array();
        foreach ($params as $k => $v)
        {
            if (substr($k, 0, 8) == 'campaign')
            {
                $cams[] = $v;
            }
        }
        return $cams;
    }

    protected function getPagination($x, $m)
    {
        $pages = array();
        if ($m <= 7)
        {
            for ($i = 1; $i <= $m; $i++)
            {
                $pages[] = $i;
            }
        }
        else if ($x <= $m / 2)
        {
            $pages[] = $x <= 3 ? 1 : $x - 2;
            $pages[] = $x <= 3 ? 2 : $x - 1;
            $pages[] = $x <= 3 ? 3 : $x;
            $pages[] = $x <= 3 ? 4 : $x + 1;
            $pages[] = $x <= 3 ? 5 : $x + 2;
            $pages[] = 0;
            $pages[] = $m;
        }
        else
        {
            $pages[] = 1;
            $pages[] = 0;
            $pages[] = $x >= $m - 2 ? $m - 4 : $x - 2;
            $pages[] = $x >= $m - 2 ? $m - 3 : $x - 1;
            $pages[] = $x >= $m - 2 ? $m - 2 : $x;
            $pages[] = $x >= $m - 2 ? $m - 1 : $x + 1;
            $pages[] = $x >= $m - 2 ? $m : $x + 2;
        }
        return $pages;
    }

    protected function addCodesToParams2($params, $codes, $key1, $key2)
    {
        if (is_array($codes))
        {
            foreach ($codes as $code)
            {
                $items = split('-', $code);
                if (!array_key_exists($items[0], $params[$key1]))
                {
                    $params[$key1][] = $items[0];
                }
                if (!array_key_exists($items[1], $params[$key2]))
                {
                    $params[$key2][] = $items[1];
                }
            }
        }
        else
        {
            $items = split('-', $codes);
            $params[$key1][] = $items[0];
            $params[$key2][] = $items[1];
        }
        return $params;
    }

    protected function makeRailCodeParams($params, $key)
    {
        foreach ($params[$key] as $eki_code)
        {
            $ensen_code = substr($eki_code, 0, 4);
            if (!array_key_exists($ensen_code, $params['RailCd']))
            {
                $params['RailCd'][] = $ensen_code;
            }
        }
        return $params;
    }

    protected function extractParams($params, $key)
    {
        $len = strlen($key);
        $a = array();
        foreach ($params as $k => $v)
        {
            if (substr($k, 0, $len) == $key)
            {
                $a[] = $v;
            }
        }
        return $a;
    }

    /**
     * 全角チェック
     *
     * @param $name チェック対象
     * @return 0:OK 1:NG
     */
    protected function checkZenkaku($name)
    {
        if (preg_match("/^[ぁ-んァ-ヶー一-龠]+$/u", $name))
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }

    /**
     * 全角カナチェック
     *
     * @param $name チェック対象
     * @return 0:OK 1:NG
     */
    protected function checkZenkakuKana($name)
    {
        if (preg_match("/^[ァ-ヶー]+$/u", $name))
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }

    /**
     * メールアドレスチェック
     *
     * @param $name チェック対象
     * @return 0:OK 1:NG
     */
    protected function checkMail($name)
    {
        if (preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|', $name))
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }

    /**
     * 都道府県情報をランダム取得
     *
     * @param $num 取得数
     * @return ランダム取得した都道府県情報
     */
    protected function getRandomPrefs($num)
    {
        $a = Apm_Config_Search::$TODOUFUKEN_NAME_CODE_LIST;
        $b = array();
        $c = 0;
        $ks = array_keys($a);
        shuffle($ks);
        foreach ($ks as $k)
        {
            $jp = $this->getPrefNameJP($k);
            if ($jp)
            {
                $b[$a[$k]] = $jp;
                $c++;
                if ($c == $num) break;
            }
        }
        return $b;
    }

    /**
     * 検討リスト取得
     */
    protected function loadData()
    {
        $params = $this->getParameters();
        $kentoList = $_COOKIE['kentoList'];

        if (!isset($kentoList) || empty($kentoList) || $kentoList == '')
        {
            $this->_data['NoData'] = true;
            return;
        }

        $model = new Renew_Model_BukkenList();
        $model_conv = new Rstobi_Model_Converte();
        $model_common = new Rstobi_Model_Common();

        $from = $model_common->getCampFrom($params);

        $dbParams = array();

        $kentos = explode(',', $kentoList);

        $data = $model->getBukenByCds(implode(',', $kentos), $from, $dbParams);
        $model_conv->dataConverteForBuken($data, $params, false, false);

        $prev = NULL;
        $c = -1;
        foreach ($data as $d)
        {
            $tatemono = $d['T03_DAIHYO_TATEMONO_CD'];
            if ($prev != $tatemono)
            {
                $c++;
                $items[] = array();
            }
            $d['MAX_CHINRYO_STR'] = (intval($d['MAX_CHINRYO']) / 10000);
            $d['MIN_CHINRYO_STR'] = (intval($d['MIN_CHINRYO']) / 10000);
            // OEM判定
            $OemFlg = ((array_key_exists('OemCd', $params) == true) && (is_null($params['OemCd']) == false) && (is_numeric($params['OemCd']) == true));
            // 物件画像取得
            $d['BUKEN_IMAGE'] = Apm_Bukkenitems::GetImageDataMain($d, $OemFlg);
            $d['FULLGAZOU_ICON'] = Apm_Bukkenitems::GetFullGazouIcon($d['BUKEN_IMAGE']);
            // キャンペーン取得
            $heyaCd = $d['T03_HEYA_CD'];
            $ret = $model->getCamp($heyaCd);
            if (!empty($ret))
            {
                $d['M94_ITEM_ICON'] = $ret['M94_ITEM_ICON'];
                $d['M94_CAMPAIGN_URL'] = $ret['M94_CAMPAIGN_URL'];
                $d['M94_CAMPAIGN_NAME'] = $ret['M94_CAMPAIGN_NAME'];
            }

            $items[$c][] = $d;
            $prev = $tatemono;
        }

        $this->_data['list'] = $items;
    }

    /**
     * 店舗の表示順位を、代表物件以外はランダムにする
     * 2店舗目が存在する場合、初期表示にチェックを状態になるようにする
     */
    protected function bukkenShuffleAndDefaultChecked()
    {
        $items = $this->_data['buken']['tenpo1'];
        if (count($items) <= 1)
        {
            return;
        }

        $daihyo = array_shift($items);
        shuffle($items);

        $items[0]['default_checked'] = true;

        array_unshift($items, $daihyo);
        $this->_data['buken']['tenpo1'] = $items;
    }

    /**
     * SEO対策用のmetaタグに配置する文章を設定
     */
    protected function setSeoMeta()
    {
    }

}